#include "comunicacao_cliente.h"

int executa_sistema_cliente(int sockfd){
  int opt, idfilme, num_filmes;
#ifdef MARCAR_TEMPOS_CLIENTE
  char nome[200];
  char c = 'a';
  char indice[2];
  FILE *fp; /* Arquivo onde sao escritos os tempos */

  indice[1] = '\0';
  while(1){
    strcpy(nome, ARQ_TEMPO_CLIENTE);
    indice[0] = c;
    c++;
    strcat(nome, indice);
    strcat(nome, EXT);
    if((fp = fopen(nome, "r")))
      fclose(fp);
    else
      break;
  }

  /* Abre o arquivo para escrita */
  fp = fopen(nome, "w");
#endif

  printf("\nBem vindo ao sistema de informacoes de filmes!\n");
  while(1){
    do{
      printf("\nEscolha uma das opcoes abaixo: \n\n");
      printf("  1. Listar todos os numeros de filmes com seus titulos\n");
      printf("  2. Mostrar sinopse de um filme\n");
      printf("  3. Mostrar todas as informacoes de um filme\n");
      printf("  4. Listar todas as informacoes de todos os filmes\n");
      printf("  0. Sair\n");
      printf("\n  Opcao: ");
      scanf("%d", &opt);
    }while(opt<0 || opt>4);

#ifdef MARCAR_TEMPOS_CLIENTE
    /* Marca instante anterior a requisicao */
    gettimeofday(&t0_cliente, NULL);
#endif
    if(write_int(sockfd, opt)<0)
      return -1;
    switch(opt){
    case 0:  /***************SAIU***************/
#ifdef MARCAR_TEMPOS_CLIENTE
      fclose(fp);
#endif
      close(sockfd);
      return 0;
    case 1:  /***************LISTOU TITULOS***************/
      if(receber_titulos(sockfd)<0)
	return -1;
      break;
    case 2:  /***************BUSCOU SINOPSE***************/
      if(read_int(sockfd, &num_filmes)<0)
	return -1;
      do{
	printf("Numero do filme (de 0 ate %d): ", num_filmes-1);
	scanf("%d", &idfilme);
      }while(idfilme<0 || idfilme>=num_filmes);
      /* Envia numero do filme */
#ifdef MARCAR_TEMPOS_CLIENTE
      /* Marca instante anterior a requisicao descontando entrada */
      gettimeofday(&t0_cliente, NULL);
#endif
      if(write_int(sockfd, idfilme)<0)
	return -1;
      if(receber_sinopse_filme(sockfd, idfilme)<0)
	return -1;
      break;
    case 3:  /***************BUSCOU TUDO DE UM FILME***************/
      if(read_int(sockfd, &num_filmes)<0)
	return -1;
      do{
	printf("Numero do filme (de 0 ate %d): ", num_filmes-1);
	scanf("%d", &idfilme);
      }while(idfilme<0 || idfilme>=num_filmes);
      /* Envia numero do filme */
#ifdef MARCAR_TEMPOS_CLIENTE
      /* Marca instante anterior a requisicao descontando entrada */
      gettimeofday(&t0_cliente, NULL);
#endif
      if(write_int(sockfd, idfilme)<0)
	return -1;
      if(receber_informacoes_filme(sockfd, idfilme)<0)
	return -1;
      break;
    case 4:  /***************LISTOU TUDO***************/
      if(receber_tudo(sockfd)<0)
	return -1;
      break;
    }

#ifdef MARCAR_TEMPOS_CLIENTE
    /* Salva o tempo medido em um arquivo */
    fprintf(fp, "%lf;\n", t1_cliente.tv_sec-t0_cliente.tv_sec+(t1_cliente.tv_usec-t0_cliente.tv_usec)/(double)1000000);
#endif

  }

  return 0;
}

int receber_titulos(int sockfd){
  int i, num_filmes;
  char titulo[MAX_FILMES][TAM_MAX_TITULO];

  /* Recebe os titulos */
  if(read_int(sockfd, &num_filmes)<0)
    return -1;
  for(i=0; i<num_filmes; i++){
    if(read_string(sockfd, titulo[i], TAM_MAX_TITULO)<0)
      return -1;
  }
#ifdef MARCAR_TEMPOS_CLIENTE
  /* Marca o tempo no instante apos o recebimento */
  gettimeofday(&t1_cliente, NULL);
#endif

  /* Imprime saida */
  printf("\nListagem de todos os titulos cadastrados:\n\n");
  for(i=0; i<num_filmes; i++){
    printf("%3.1d. ", i);
    fputs(titulo[i], stdout);
    printf("\n");
  }

  printf("\n");
  return 0;
}

int receber_sinopse_filme(int sockfd, int idfilme){
  char sinopse[TAM_MAX_SINOPSE];
  if(read_string(sockfd, sinopse, TAM_MAX_SINOPSE)<0)
    return -1;
#ifdef MARCAR_TEMPOS_CLIENTE
  /* Marca o tempo no instante apos o recebimento */
  gettimeofday(&t1_cliente, NULL);
#endif
  printf("\nSinopse do filme numero %d: \n\n", idfilme);
  fputs(sinopse, stdout);
  printf("\n\n");
  return 0;
}

int receber_informacoes_filme(int sockfd, int idfilme){
  char titulo[TAM_MAX_TITULO];
  char horario[TAM_MAX_HORARIO];
  int sala;
  char sinopse[TAM_MAX_SINOPSE];
  if(read_string(sockfd, titulo, TAM_MAX_TITULO)<0)
    return -1;
  if(read_string(sockfd, horario, TAM_MAX_HORARIO)<0)
    return -1;
  if(read_int(sockfd, &sala)<0)
    return -1;
  if(read_string(sockfd, sinopse, TAM_MAX_SINOPSE)<0)
    return -1;
#ifdef MARCAR_TEMPOS_CLIENTE
  /* Marca o tempo no instante apos o recebimento */
  gettimeofday(&t1_cliente, NULL);
#endif
  printf("\nInformacoes do filme numero %d: \n\n", idfilme);
  printf("Titulo: ");
  fputs(titulo, stdout);
  printf("\nHorarios: ");
  fputs(horario, stdout);
  printf("\nSala: %d", sala);
  printf("\nSinopse: ");
  fputs(sinopse, stdout);
  printf("\n\n-----------------------------------------------\n");
  return 0;
}

int receber_tudo(int sockfd){
  int i, num_filmes;
  tFilme filme[MAX_FILMES];
  /* Recebe todas as informacoes */
  if(read_int(sockfd, &num_filmes)<0)
    return -1;
  for(i=0; i<num_filmes; i++){
    if(read_string(sockfd, filme[i].titulo, TAM_MAX_TITULO)<0)
      return -1;
    if(read_string(sockfd, filme[i].horario, TAM_MAX_HORARIO)<0)
      return -1;
    if(read_int(sockfd, &filme[i].sala)<0)
      return -1;
    if(read_string(sockfd, filme[i].sinopse, TAM_MAX_SINOPSE)<0)
      return -1;
  }

#ifdef MARCAR_TEMPOS_CLIENTE
  /* Marca o tempo no instante apos o recebimento */
  gettimeofday(&t1_cliente, NULL);
#endif

  /* Imprime a saida */
  printf("\nInformacoes de todos os filmes cadastrados:\n\n");
  for(i=0; i<num_filmes; i++){
    printf("\nInformacoes do filme numero %d: \n\n", i);
    printf("Titulo: ");
    fputs(filme[i].titulo, stdout);
    printf("\nHorarios: ");
    fputs(filme[i].horario, stdout);
    printf("\nSala: %d", filme[i].sala);
    printf("\nSinopse: ");
    fputs(filme[i].sinopse, stdout);
    printf("\n\n-----------------------------------------------\n");
  }
  return 0;
}
